package com.bestcem.xm.txtanls.dao.impl;//package com.bestcem.xm.txtanls.dao.impl;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.lang.Validator;
//import com.bestcem.xm.txtanls.dao.TopicDao;
//import com.bestcem.xm.txtanls.entity.pojo.TopicDO;
//import com.bestcem.xm.txtanls.entity.pojo.TopicGroupInfo;
//import com.bestcem.xm.txtanls.util.enums.TopicStatusEnum;
//import com.bestcem.xm.txtanls.util.enums.TopicTypeEnum;
//import com.bestcem.xm.common.core.uitls.DateUtil;
//import com.mongodb.client.result.DeleteResult;
//import com.mongodb.client.result.UpdateResult;
//import org.apache.commons.lang3.ObjectUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.bson.types.ObjectId;
//import org.springframework.data.mongodb.core.MongoTemplate;
//import org.springframework.data.mongodb.core.aggregation.*;
//import org.springframework.data.mongodb.core.query.Criteria;
//import org.springframework.data.mongodb.core.query.Query;
//import org.springframework.data.mongodb.core.query.Update;
//import org.springframework.stereotype.Repository;
//
//import javax.annotation.Resource;
//import java.util.*;
//
//import static com.bestcem.xm.txtanls.util.CollectionName.TXTANLS_TOPIC;
//import static com.bestcem.xm.txtanls.util.ColumnConstant.Base.UPDATED_DT;
//import static com.bestcem.xm.txtanls.util.ColumnConstant.Base._ID;
//import static com.bestcem.xm.txtanls.util.ColumnConstant.Topic.*;
//import static com.bestcem.xm.txtanls.util.Constants.*;
//
///**
// * @author liheng
// * @version v1.0
// * @date 2021/6/28 14:36
// */
//@Repository
//public class TopicDaoImpl implements TopicDao {
//    /**
//     * mongo中$where操作符
//     */
//    public static final String OPREATION_WHERE = "$where";
//    /**
//     * mongo查询语句数组字段长度大于0
//     */
//    public static final String SIZE_GT_ZERO = "this.key_dict.length > 0";
//    /**
//     * mongo连表查询语句
//     */
//    public static final String LOOKUP_EXPRESSION = "{'$toString': '$_id'}";
//
//    /**
//     * 话题list 字段名
//     */
//    public static final String TOPIC_LIST_NAME = "topicList";
//
//    @Resource
//    private MongoTemplate mongoTemplate;
//
//
//    /**
//     * 新增话题
//     *
//     * @param topicDO 话题实体，非空
//     * @return 新增记录id
//     */
//    @Override
//    public TopicDO saveTopic(TopicDO topicDO) {
//        topicDO.setCreatedDate(DateUtil.getMongoDate());
//        topicDO.setUpdatedDate(DateUtil.getMongoDate());
//        if (Objects.isNull(topicDO.getKeyDict())) {
//            topicDO.setKeyDict(Collections.emptyList());
//        }
//        return mongoTemplate.insert(topicDO, TXTANLS_TOPIC);
//    }
//
//
//    /**
//     * 新增话题
//     *
//     * @param projectId
//     * @param name
//     * @param groupId
//     * @param keywords
//     * @return
//     */
//    @Override
//    public TopicDO insertTopic(String projectId, String name, String groupId, List<String> keywords) {
//        TopicDO topicDO = new TopicDO(projectId, name, groupId, TopicTypeEnum.TOPIC.getIndex(), TopicStatusEnum.NO_TRAIN.getIndex(), keywords);
//        return this.saveTopic(topicDO);
//    }
//
//    /**
//     * 新增话题组
//     *
//     * @param projectId
//     * @param name
//     * @return
//     */
//    @Override
//    public TopicDO insertGroup(String projectId, String name) {
//        TopicDO topicDO = new TopicDO(projectId, name, "", TopicTypeEnum.GROUP.getIndex(), TopicStatusEnum.NO_TRAIN.getIndex());
//        return this.saveTopic(topicDO);
//    }
//
//
//    /**
//     * 根据id查实体详情
//     *
//     * @param id 话题id 非空，调用前请判空
//     * @return 话题
//     */
//    @Override
//    public TopicDO getById(String id) {
//        return mongoTemplate.findById(new ObjectId(id), TopicDO.class);
//    }
//
//    /**
//     * 新增默认话题组
//     *
//     * @param projectId 文本分析项目id，非空，调用前判空
//     * @return 默认话题组id
//     */
//    @Override
//    public TopicDO createDefaultTopicGroup(String projectId) {
//        TopicDO topicDO = new TopicDO();
//        topicDO.setProjectId(projectId);
//        topicDO.setType(TopicTypeEnum.GROUP.getIndex());
//        topicDO.setTopicGID(EMPTY);
//        topicDO.setName(DEFAULT_TOPIC_GROUP_NAME);
//        topicDO.setStatus(TopicStatusEnum.NO_TRAIN.getIndex());
//        return this.saveTopic(topicDO);
//    }
//
//    /**
//     * 查询默认话题组id
//     *
//     * @param projectId 文本分析项目id，非空
//     * @return 话题组id
//     */
//    @Override
//    public TopicDO getDefaultTopicGroup(String projectId) {
//        Query query = new Query(Criteria.where(ANLS_PROJECT_ID).is(new ObjectId(projectId)).and(TTYPE)
//                .is(TopicTypeEnum.GROUP.getIndex()).and(NAME).is(DEFAULT_TOPIC_GROUP_NAME).and(TOPICG_ID).is(EMPTY));
//        TopicDO topicDOEntities = mongoTemplate.findOne(query, TopicDO.class);
//        if (ObjectUtils.isEmpty(topicDOEntities)) {
//            return null;
//        }
//        return topicDOEntities;
//    }
//
//    /**
//     * 根据类型查询话题list
//     *
//     * @param projectId 文本分析字段id
//     * @param type      话题类型
//     * @return 话题list
//     * @author liheng
//     */
//    @Override
//    public List<TopicDO> listTopicByType(String projectId, Integer type) {
//        Query query = new Query();
//        query.addCriteria(Criteria.where(ANLS_PROJECT_ID).is(new ObjectId(projectId)));
//        if (Validator.isNotEmpty(type)) {
//            query.addCriteria(Criteria.where(TTYPE).is(type));
//        }
//        return mongoTemplate.find(query, TopicDO.class);
//    }
//
//
//    /**
//     * 根据名称查询话题
//     *
//     * @param projectId
//     * @param type
//     * @param name
//     * @return List<Topic>
//     * @version v1.0
//     * @author gy.liu
//     * @date 2021/7/22
//     */
//    @Override
//    public List<TopicDO> listTopicByName(String projectId, Integer type, String name) {
//        Query query = new Query();
//        query.addCriteria(Criteria.where(ANLS_PROJECT_ID).is(new ObjectId(projectId)));
//        query.addCriteria(Criteria.where(TTYPE).is(type));
//        query.addCriteria(Criteria.where(NAME).is(name));
//        return mongoTemplate.find(query, TopicDO.class);
//    }
//
//
//    @Override
//    public List<TopicDO> listTopicByKeywordExist(String projectId) {
//        Query query = Query.query(Criteria.where(ANLS_PROJECT_ID).is(new ObjectId(projectId)));
//        query.addCriteria(Criteria.where(OPREATION_WHERE).is(SIZE_GT_ZERO));
//        query.addCriteria(Criteria.where(TTYPE).is(TopicTypeEnum.TOPIC.getIndex()));
//        query.fields().include(_ID, NAME, KEY_DICT);
//        return mongoTemplate.find(query, TopicDO.class);
//    }
//
//
//    /**
//     * 根据项目id查询出所有的Topic
//     *
//     * @param projectId 文本分析项目id
//     * @return List<TopicEntity>
//     * @author jy.zhao
//     * @date 2021/5/17 10:08
//     **/
//    @Override
//    public List<TopicDO> listTopicByProjectId(String projectId) {
//        return listTopicByType(projectId, null);
//    }
//
//    /**
//     * 根据话题组查询子话题
//     *
//     * @param topicGid 话题组id
//     * @return List<TopicEntity>
//     * @author jy.zhao
//     * @date 2021/5/17 10:14
//     **/
//    @Override
//    public List<TopicDO> listTopicByGid(String topicGid) {
//        Query query = new Query();
//        query.addCriteria(Criteria.where(TOPICG_ID).is(topicGid));
//        return mongoTemplate.find(query, TopicDO.class);
//    }
//
//    /**
//     * 删除分析项目下的全部话题
//     *
//     * @param projectId 项目id
//     * @return The result of a delete operation
//     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
//     * @date 2021/5/17 15:36
//     */
//    @Override
//    public DeleteResult deleteProjectAllTopic(String projectId) {
//        Query query = new Query();
//        query.addCriteria(Criteria.where(ANLS_PROJECT_ID).is(new ObjectId(projectId)));
//        return mongoTemplate.remove(query, TopicDO.class, TXTANLS_TOPIC);
//    }
//
//
//    /**
//     * 查询文本分析项目所有话题的关键词
//     *
//     * @param projectId
//     * @return
//     * @author liheng
//     * @date 2021/5/24 17:29
//     */
//    @Override
//    public Set<String> listTopicKeyword(String projectId) {
//        List<TopicDO> topicDOEntities = this.listTopicByType(projectId, TopicTypeEnum.TOPIC.getIndex());
//        Set<String> keywords = new HashSet<>(topicDOEntities.size());
//        for (int i = 0; i < topicDOEntities.size(); i++) {
//            if (CollUtil.isEmpty(topicDOEntities.get(i).getKeyDict())) {
//                continue;
//            }
//            keywords.addAll(topicDOEntities.get(i).getKeyDict());
//        }
//        return keywords;
//    }
//
//
//    /**
//     * 根据名称查话题和话题组
//     *
//     * @param projectId 文本分析项目id
//     * @param name      名称
//     * @return
//     * @author liheng
//     * @date 2021/5/20 13:50
//     */
//    @Override
//    public long countByName(String projectId, String name) {
//        Query query = new Query();
//        query.addCriteria(Criteria.where(ANLS_PROJECT_ID).is(new ObjectId(projectId)).and(NAME).is(name));
//        return mongoTemplate.count(query, TopicDO.class);
//    }
//
//    /**
//     * 修改单个话题组下所有话题的话题组id
//     *
//     * @param oldGroupId 话题组id
//     * @param newGroupId 新话题组id
//     * @param projectId  文本分析项目id
//     * @return
//     */
//    @Override
//    public UpdateResult updateTopicGIdByGId(String oldGroupId, String newGroupId, String projectId) {
//        Query query = Query.query(Criteria.where(TOPICG_ID).is(oldGroupId).and(ANLS_PROJECT_ID).is(new ObjectId(projectId)));
//        Update update = Update.update(TOPICG_ID, newGroupId);
//        update.currentDate(UPDATED_DT);
//        return mongoTemplate.updateMulti(query, update, TopicDO.class);
//
//    }
//
//    @Override
//    public DeleteResult deleteById(String id) {
//        Query query = Query.query(Criteria.where(_ID).is(new ObjectId(id)));
//        return mongoTemplate.remove(query, TopicDO.class);
//
//
//    }
//
//    /**
//     * 修改话题名或关键词，关键词为覆盖修改
//     *
//     * @param id       话题id
//     * @param name     话题名
//     * @param keywords 关键词
//     * @author liheng
//     * @date 2021/5/24 16:58
//     */
//    @Override
//    public UpdateResult updateNameOrKeywords(String id, String name, List<String> keywords) {
//        Query query = Query.query(Criteria.where(_ID).is(new ObjectId(id)));
//        Update update = new Update();
//        update.currentDate(UPDATED_DT);
//        if (StringUtils.isNotBlank(name)) {
//            update = update.set(NAME, name);
//        }
//        if (CollUtil.isNotEmpty(keywords)) {
//            query.addCriteria(Criteria.where(TTYPE).is(TopicTypeEnum.TOPIC.getIndex()));
//            update.set(KEY_DICT, keywords);
//        }
//        return mongoTemplate.updateFirst(query, update, TopicDO.class);
//    }
//
//    /**
//     * 修改话题关键词
//     *
//     * @param id       话题id
//     * @param keywords 关键词list
//     * @return 修改结果
//     */
//    @Override
//    public UpdateResult updateKeyword(String id, List<String> keywords) {
//        Query query = Query.query(Criteria.where(_ID).is(new ObjectId(id)));
//        query.addCriteria(Criteria.where(TTYPE).is(TopicTypeEnum.TOPIC.getIndex()));
//        Update update = new Update();
//        update.currentDate(UPDATED_DT);
//        update.set(KEY_DICT, keywords);
//        return mongoTemplate.updateFirst(query, update, TopicDO.class);
//    }
//
//    /**
//     * 添加关键词
//     *
//     * @param id
//     * @param name
//     * @param keywords
//     * @author liheng
//     * @date 2021/5/24 17:06
//     */
//    @Override
//    public UpdateResult appendKeywords(String id, String name, List<String> keywords) {
//        Query query = Query.query(Criteria.where(_ID).is(id).and(NAME).is(name).and(TTYPE).is(TopicTypeEnum.TOPIC.getIndex()));
//        Update update = new Update();
//        update.addToSet(KEY_DICT).each(keywords);
//        return mongoTemplate.updateFirst(query, update, TopicDO.class);
//    }
//
//    /**
//     * 修改话题的话题组id
//     *
//     * @param id
//     * @param topicGroupId
//     * @return
//     * @author liheng
//     * @date 2021/5/21 11:42
//     */
//    @Override
//    public UpdateResult updateGroupIdById(String id, String topicGroupId) {
//        Query query = Query.query(Criteria.where(_ID).is(new ObjectId(id)));
//        Update update = Update.update(TOPICG_ID, topicGroupId);
//        return mongoTemplate.updateFirst(query, update, TopicDO.class);
//    }
//
//
//    /**
//     * 查询项目中的话题组以及包含的话题
//     *
//     * @param projectId 文本分析项目id
//     * @author liheng
//     * @date 2021/5/21 11:42
//     */
//    @Override
//    public List<TopicGroupInfo> aggregateTopic(String projectId) {
//        MatchOperation match = Aggregation.match(Criteria.where(ANLS_PROJECT_ID).is(new ObjectId(projectId)).and(TTYPE).is(TopicTypeEnum.GROUP.getIndex()));
//        ProjectionOperation project = Aggregation.project(Fields.fields(NAME, TTYPE, ANLS_PROJECT_ID, STATUS))
//                .andExpression(LOOKUP_EXPRESSION
//                ).as(_ID);
//        LookupOperation topicList = Aggregation.lookup(TXTANLS_TOPIC, _ID, TOPICG_ID, TOPIC_LIST_NAME);
//        AggregationResults<TopicGroupInfo> aggregate = mongoTemplate.aggregate(Aggregation.newAggregation(match, project, topicList), TXTANLS_TOPIC, TopicGroupInfo.class);
//        return aggregate.getMappedResults();
//    }
//
//    /**
//     * 话题移动到默认话题组
//     *
//     * @param topicGId
//     * @param projectId
//     * @author liheng
//     * @date 2021/5/25 10:03
//     */
//    @Override
//    public UpdateResult moveTopicToDefaultGroup(String topicGId, String projectId) {
//        List<TopicDO> topicDOEntities = this.listTopicByGid(topicGId);
//        if (org.springframework.util.ObjectUtils.isEmpty(topicDOEntities)) {
//            return UpdateResult.acknowledged(LONG_ZERO, LONG_ZERO, null);
//        }
//        TopicDO defaultTopicDOGroup = this.getDefaultTopicGroup(projectId);
//        if (org.springframework.util.ObjectUtils.isEmpty(defaultTopicDOGroup)) {
//            defaultTopicDOGroup = this.createDefaultTopicGroup(projectId);
//        }
//        return this.updateTopicGIdByGId(topicGId, defaultTopicDOGroup.getId(), projectId);
//    }
//
//
//}
